package logica.analizador;
import java.util.*;

import excepciones.ContenidoException;
import excepciones.DataStructureException;

import logica.common.TagCollection;

public class DocumentoJerarquico {

	private String titulo;
	private String contenido;
	private Vector<String> contenidoSecciones;
	private TagCollection aTagCollection;

	public DocumentoJerarquico (String texto) throws ContenidoException, DataStructureException
	{
		this.aTagCollection = new TagCollection();
		
		texto = texto.trim();
		this.contenidoSecciones = new Vector<String>();
		if (this.tieneSecciones(texto) > 1)
		{
			if (this.seccionAnidada(texto))
			{
				this.titulo = this.obtenerTitulo(texto).trim();
				this.contenido = this.obtenerContenido(texto);
				this.contenidoSecciones = this.obtenerContenidoSecciones(this.contenido);
			}
			else
			{
				this.contenidoSecciones = this.obtenerContenidoSecciones(texto);			
				this.titulo = "";
				this.contenido = texto;
				//this.contenido = "";
			}
		}
		else
		{
			this.titulo = this.obtenerTitulo(texto).trim();
			this.contenido = this.obtenerContenido(texto);
		}



		
	}

	private boolean seccionAnidada(String aTexto) throws ContenidoException {

		Stack<String> tags = new Stack<String>();
		String tag="";
		int iSecciones = 0;

		while (aTexto.length()>0)
		{	
			int aperturaTag = aTexto.indexOf("<");
			int cierreTag = aTexto.indexOf(">");
			if (aperturaTag != -1 && cierreTag != -1)
			{
				tag = aTexto.substring(aperturaTag, cierreTag+1);
				if (this.aTagCollection.esTagApeturaSeccion(tag))
				{
					if (tags.isEmpty())
					{
						iSecciones++;
					}
					tags.push(tag);
				}
				else if (this.aTagCollection.esTagCierreSeccion(tag))
				{
					boolean esTagApertura= this.aTagCollection.esTagApetura(tags.lastElement());
					String pop = tags.lastElement();
					String elementoSinSlash = tag.replace("/", "");
					
					if (tags.empty())
					{
						throw new ContenidoException();
					}
					else if (!esTagApertura || !(pop.equals(elementoSinSlash)))
					{
						throw new ContenidoException();
					}
					else
					{
						tags.pop();
					}
				}
				aTexto = (new String(aTexto.substring(cierreTag+1).trim()));
			}
			else
			{ // Hay error de sintaxis o quedan espacios.
				throw new ContenidoException();
			}
		}
		return (iSecciones == 1);
	}

	public Vector<String> getContenidoSecciones() {
		return contenidoSecciones;
	}

	public void setContenidoSecciones(Vector<String> contenidoSecciones) {
		this.contenidoSecciones = contenidoSecciones;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public String getContenido() {
		return contenido;
	}

	public void setContenido(String contenido) {
		this.contenido = contenido;
	}

	public String obtenerTitulo(String texto)
	{
		String titulo = "";
		
		int iTit = texto.indexOf("<tit>");
		int iBTit = texto.indexOf("</tit>");
		if (iTit != -1 && iBTit != -1)
		{
			titulo = texto.substring(iTit+5, iBTit);
		}
			
		return titulo;
	}
	
	public String obtenerContenido(String texto)
	{
		String contenido = texto;
		int iInitCont = texto.indexOf("<con>");
		int iFinCont = texto.lastIndexOf("</con>");
		if (iInitCont != -1 && iFinCont != -1)
		{
			contenido = texto.substring(iInitCont+5, iFinCont);	
		}
		return contenido;
	}
	
	public int tieneSecciones(String sContenido) throws DataStructureException
	{
		return (this.aTagCollection.tieneTagsSecciones(sContenido));
	}
	
	public Vector<String> obtenerContenidoSecciones(String aTexto) throws ContenidoException
	{
		Vector<String> resultado=new Vector<String>();
		Stack<String> tags = new Stack<String>();
		String tag="";
		String seccion = "";
		int iSlice = 0;
		boolean saveSection = false;

		while (aTexto.length()>0)
		{	
			iSlice = 0;
			//Caso base ya recorrimos y extragimos la seccion que queriamos.
			if(seccion.length()>0  && saveSection)
			{
				resultado.addElement(seccion);
				seccion="";
				saveSection = false;
			}
				
			int aperturaTag = aTexto.indexOf("<");
			int cierreTag = aTexto.indexOf(">");
			if (aperturaTag != -1 && cierreTag != -1)
			{
				tag = aTexto.substring(aperturaTag, cierreTag+1);
				if (this.aTagCollection.esTagApeturaSeccion(tag))
				{
					String outerSeccion = aTexto.substring(0, aperturaTag).trim();
					if(seccion.length() > 0 && tags.empty())
					{
						resultado.addElement(seccion);
						iSlice = aperturaTag;
						seccion = "";
						
					}
					if (outerSeccion.length() > 0 && tags.empty())
					{
						resultado.addElement(outerSeccion);
						iSlice = aperturaTag; 
					}
					tags.push(tag);
				}
				else if (this.aTagCollection.esTagCierreSeccion(tag))
				{
					boolean esTagApertura= this.aTagCollection.esTagApetura(tags.lastElement());
					String pop = tags.lastElement();
					String elementoSinSlash = tag.replace("/", "");
					
					if (tags.empty())
					{
						throw new ContenidoException();
					}
					else if (!esTagApertura || !(pop.equals(elementoSinSlash)))
					{
						throw new ContenidoException();
					}
					else
					{
						tags.pop();
						if (tags.empty())
						{
							saveSection = true;	
						}
						
					}
				}				
				//Se va guardando la seccion.
				seccion=seccion+aTexto.substring(iSlice, cierreTag+1).trim();
				//aTexto = new StringBuffer(aTexto.substring(cierreTag+1));
				aTexto = (new String(aTexto.substring(cierreTag+1).trim()));

			}
			else
			{ // Hay error de sintaxis o quedan espacios.
				throw new ContenidoException();
			}
			
		}
		//Ultima seccion se nos vacio el String Buffer, je.
		if(tags.empty() && seccion.length()>0)
		{
			resultado.addElement(seccion);
			seccion="";
		}
		return resultado;
	}
}
